#ifdef __X2LIB_WIN32__

#ifndef _27E4A2CA_52A1_4B90_BF65_C0C6720DB6BF
#define _27E4A2CA_52A1_4B90_BF65_C0C6720DB6BF

#include "depends/incfile.h"
#include "xCores.h"
#include "Transceiver.h"

namespace x2lib
{
	/*************************************************************************
	** Name		: ProcPiper
	** Desc		: 管道封装，支持一对多，线程安全
	** Author	: xktesla@2016-8-16 22:57:47
	*************************************************************************/
	class ProcPiper : public Transceiver
	{
	public:
		struct Channel : AbsChannel
		{

		};

		class Listener
		{
		public:
			/*************************************************************************
			** Desc     : 响应连接状态
			** Param    : [in] pChannel 连接
			** Return   :
			** Author   : xktesla
			*************************************************************************/
			virtual void OnPipeConn(const Channel* pChannel) = 0;

			/*************************************************************************
			** Desc     : 响应数据接收
			** Param    : [in] pChannel 连接
			**		    : [in] pMsg 接收到的数据
			** Return   :
			** Author   : xktesla
			*************************************************************************/
			virtual int OnPipeRecv(const Channel* pChannel, void* pData, int nData) = 0;
		};

	public:
		/*************************************************************************
		** Desc     : 构建管道
		** Param    : [in] isClient 是否作为客户端
		**		    : [in] pListener 监听器
		** Return   :
		** Author   : xktesla
		*************************************************************************/
		ProcPiper(bool isClient, ProcPiper::Listener* pListener);
		virtual ~ProcPiper();

		/*************************************************************************
		** Desc     : 构建管道，兼任收发数据，因此应放在一个专用线程里执行，效率过
		**				低时可采用线程池执行
		** Param    : [in] szName 管道名
		**		    : [in] isRetry 是否在连接失败后重试（仅对客户端有效）
		** Return   :
		** Author   : xktesla
		*************************************************************************/
		bool Execute(const char* pszName = "\\\\.\\Pipe\\pipe_demo", int reConnWaitsec = 15, int reConnTimes = 10);

		void Exit();

	protected:
		// 通过 Transceiver 继承
        virtual int ApiSend(AbsChannel* pChannel, void* pData, uint32_t nData, uint32_t* pnBytes) override;
        virtual bool ApiRecv(AbsChannel* pChannel, void* pData, uint32_t nData, uint32_t* pnBytes) override;
		virtual AbsChannel* connectServer(bool isReConn) override;
		virtual AbsChannel* prepareServer() override { return nullptr; };
		virtual AbsChannel* acceptClients() override;
		virtual void closeChannel(AbsChannel* pChannel) override;

		// 通过 Listener 继承
		virtual void OnConnected(AbsChannel* pChannel) override;
		virtual void OnPackRecved(AbsChannel* pChannel) override;

		Listener* m_pListener;
		char m_szName[256];

	private:
		static uint8_t TRANCODE[16];

		HANDLE m_hEvtAccept; // for Accepting
		HANDLE m_hEvtSend;
		HANDLE m_hEvtRecv;
	};
}

#endif

#endif
